// Deklaracja zmiennych globalnych shadera
float4x4 World;
float4x4 View;
float4x4 Projection;
texture Texture;

// TODO: add effect parameters here.

// Obiekt, ktory pozwala samplowac tekture - sama tekstura nie wystarcza do samplowania, potrzeba tez kilku dodatkowych ustawien.
// Dzieki koncepcji samplerow, mozna miec kilka obiektow samplujacych ta sama teksture, ale w nieco inny sposob (z innymi ustawieniami).
sampler textureSampler = sampler_state
{
	Texture = <Texture>;
	MinFilter = LINEAR;
	MagFilter = LINEAR;
	MipFilter = POINT;
	AddressU  = CLAMP;
    AddressV  = CLAMP;
};

// Format wierzcholka, stanowiacy wejscie dla vertex shadera.
// Powienien dokladnie odpowiadac strukturze zdefiniowanej w aplikacji (a przeslanej do karty przez VertexDeclaration).
struct VertexShaderInput
{
    float3 Position : POSITION0;
    float2 TexCoord : TEXCOORD0;

    // TODO: add input channels such as texture
    // coordinates and vertex colors here.
};

// Struktura z danymi, ktora jest wypluwana przez vertex shader, a po dokonaniu interpolacji wartosci jest wejsciem dla pixel shadera.
struct VertexShaderOutput
{
    float4 Position : POSITION0;
    float2 TexCoord : TEXCOORD0;

    // TODO: add vertex shader outputs such as colors and texture
    // coordinates here. These values will automatically be interpolated
    // over the triangle, and provided as input to your pixel shader.
};

VertexShaderOutput VertexShaderFunction(VertexShaderInput input)
{
    VertexShaderOutput output;

	// mnozenie pozycji wierzcholka kolejno przez macierze swiata, widoku i projekcji
    float4 worldPosition = mul(float4(input.Position, 1.0f), World);
    float4 viewPosition = mul(worldPosition, View);
    output.Position = mul(viewPosition, Projection);
    
    // koordynaty tekstury sa bez zmian przekazywane do pixel shadera
    output.TexCoord = input.TexCoord;

    // TODO: add your vertex shader code here.

    return output;
}

float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0
{
    // TODO: add your pixel shader code here.

	// jako ostateczny kolor piksela zwracana jest wartosc "wysamplowana" z tekstury
	// przy uzyciu koordynatow zinterpolowanych z sasiednich wierzcholkow
    return tex2D(textureSampler, input.TexCoord);
}

// Technika. W pliku efektu moze znajdowac sie wiele technik. Dzieje sie tak najczesciej wtedy,
// gdy czesc kodu, z ktorego korzystaja techniki, jest wspolna.
// Moznaby, na przyklad, miec dwie techniki, korzystajacego z tego samego vertex shadera i roznych pixel shaderow.
// Zeby nie powielac kodu vertex shadera w dwoch plikach, umieszcza sie go wraz z pixel shaderami
// i definicjami technik w jednym pliku .fx.
technique Technique1
{

    // Pass - przebieg. Pass to jednorazowe narysowanie calej geometrii rysowanej dana technika.
    // Bardziej skomplikowane efekty graficzne wymagaja rysowania tej samej geometrii kilkukrotnie - 
    // stad moze byc kilka przebiegow (uzywajacych do rysowania roznych shaderow).
    pass Pass1
    {
        // Zarowno w tym miejscu, jak i na poziomie kodu C# mozna ustawiac parametry renderowana - tzw. renderstates.
        // W tym przykladzie nie korzystamy jeszcze z renderstates - domyslne sa dla nas odpowiednie.
        // TODO: set renderstates here.

        VertexShader = compile vs_2_0 VertexShaderFunction();
        PixelShader = compile ps_2_0 PixelShaderFunction();
    }
}
